//
//  HomeTableViewController.swift
//  01-微博项目搭建
//
//  Created by Adolph on 15/5/14.
//  Copyright (c) 2015年 Adolph. All rights reserved.
//

import UIKit
import MJRefresh
class HomeTableViewController: BaseTableViewController, StatusCellDelegate {
   
    /**
      NSCache
    1. 线程安全
    2. 使用根 NSMutableDictionary 非常类似
    3. 当内存不足的时候，系统会自动清理 NSCache
    4. 使用 NSCache 有一个注意事项：一旦缓存的对象被清理，需要能够重新计算，NSCache 中的对象是不稳定的
    */
    
    /// 行高缓存
    var rowHeightCache = NSCache()
    
    /// 微博数据数组
    var statusesHome: [Status]? {
        didSet{
          tableView.reloadData()
         //关闭刷新控件
            refreshControl?.endRefreshing()
        }
        
    }
    
    override func viewDidLoad() {
        if !userLogin {
         return
        }
        setupRefreshControl()
    }
    /// 上拉刷新的标记
    var pullupRefreshFlag = false
    @IBAction func loadDate() {
       // 控件进入刷新状态，而不会主动的触发监听方法
        refreshControl?.beginRefreshing()
        
        // 提取数组中的第一条记录，如果没有since_id 为0
        var since_id = statusesHome?.first?.id ?? 0
        var max_id = 0
        if pullupRefreshFlag {
          since_id = 0
            max_id = statusesHome?.last?.id ?? 0
        }
        
        Status.loadStatus(since_id: since_id, max_id: max_id) { (statuses) -> () in
            if statuses == nil {
             println("没有新数据")
             // 关闭刷新控件
            self.refreshControl?.endRefreshing()
                return
            }
            
         // 单独测试转发微博的数据
//            for s in statuses! {
//              println("status id \(s.id)")
//            }
            /**
            如果是新刷新 since_id == 0，就直接给数组设置数值
            如果 since_id > 0，将结果放在 self.statuses 之前
            */
            
            if since_id > 0 {
             //下拉刷新
                self.statusesHome = statuses! + self.statusesHome!
                println("下拉刷新")
            }else if max_id > 0 {
              //在数组尾部追加守数据
                self.statusesHome = self.statusesHome! + statuses!
                // 恢复上拉刷新的标记
                self.pullupRefreshFlag = false
                println("上拉刷新完成")
            }else {
             self.statusesHome = statuses
              }

        }
        
   
    }
    
    // 设置刷新控件 
    private func setupRefreshControl() {
        self.refreshControl = ADRefreshViewControl(frame: CGRectZero)
        
        // 设置监听方法
        self.refreshControl?.addTarget(self, action: "loadDate", forControlEvents: UIControlEvents.ValueChanged)
        
        // 开始刷新数据
        loadDate()
    }
   // MARK - 数据源方法
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      // 如果 statuses == nil，返回 0
        return self.statusesHome?.count ?? 0
    
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let status = self.statusesHome![indexPath.row]
        
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCell.cellIdentifier(status)) as! StatusCell
        cell.status = status
        cell.delegatePicture = self
        
        // *** --- 上拉刷新的判断 ---
        /**
        如果最后一个 cell 出现，设置标记！开始刷新
        */
        if indexPath.row == (self.statusesHome!.count - 1) && !pullupRefreshFlag {
          // 设置上拉刷新标记
            pullupRefreshFlag = true
            // 加载数据
            loadDate()
        }
        return cell
    }
    
    // 预估行高， 能提高性能
    override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 300
    }
    //计算准确行高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // 根据微博计算行高
        // 1. 取出数据
          let status = self.statusesHome![indexPath.row]
        // 2. 判断行高是否已经缓存
        if rowHeightCache.objectForKey(status.id) != nil {
          println("返回行高的缓存")
            return rowHeightCache.objectForKey(status.id) as! CGFloat
        }
        // 3. 取出一个cell
          let cell = tableView.dequeueReusableCellWithIdentifier(StatusCell.cellIdentifier(status)) as! StatusCell
        // 4. 计算行高
         let height = cell.rowHight(status)
         // 5. 保存到缓存中
        rowHeightCache.setObject(height, forKey: status.id)
        
        return height
    }
    
    //MARK: 点击图片代理
    func statusCellDidSelectedPicture(cell: StatusCell, pictureCell: PictureCell, index: Int) {
        
        // 实例化视图控制器，此时视图控制器并没有显示在界面上，view还没有被创建
        // 类似的案例：私人通讯录
        let browserVC = PhotoBrowserViewController()
       // 设置图像数组
        browserVC.imageURLs = cell.status?.picSelectURLs
        //设置点击图片的下标
        browserVC.selectedIndex = index
        
        //设置转场的临时视图
        dummyView = pictureCell.snapshotViewAfterScreenUpdates(false)
        
        /**
        提示：坐标系的转换过程中，一定要清楚视图的层级关系，要一层一层的转
        目的：将屏幕上的一个点，在不同的视图坐标中，使用不同的坐标来展示
        */
        // 坐标系的转换 － 在不同视图间用不同的坐标表示同一个位置
        // 1> 相对于 collectionView 的坐标
        var rect = pictureCell.frame
        // 2> 将坐标转换到 cell 的坐标系
        rect = cell.convertRect(rect, fromView: cell.pictureView)
        // 3> 将坐标转换到 view的坐标系
         rect = view.convertRect(rect, fromView: cell)
        // 4> 修正 contenoffset
        rect = CGRectOffset(rect, 0, -tableView.contentOffset.y)
        dummyStartRect = rect
        // 设置 dummyView 的初始位置
        dummyView?.frame = rect
        
        // 使用 cell 内部的图像， 计算并且设置转场的结束位置
        dummyEndRect = scaleImageRect(pictureCell.iconView.image!)
        
        
        // 设置 Modal 转场代理
        browserVC.transitioningDelegate = self
        // 设置 Modal 的类型
        browserVC.modalPresentationStyle = UIModalPresentationStyle.Custom
        
        presentViewController(browserVC, animated: true, completion: nil)
    }
    ///计算目标位置 rect 
    private func scaleImageRect(image: UIImage) -> CGRect {
     let scale = image.size.width / view.bounds.size.width
     var h = image.size.width / scale
        var y: CGFloat = 0
        
        //1 长图
        if h > view.bounds.height {
          h = view.bounds.height
        } else {
         y = (view.bounds.height - h) * 0.5
        }
        
        return CGRectMake(0, y, view.bounds.width, h)
    
    }
    ///设置标题按钮(还未实现)
    private func setupTitleButton() {
//        if sharedUserAccount != nil {
//           
//        }
    }
    override func viewDidAppear(animated: Bool) {
         // 提示：所有跟动画有关的代码，一定要在界面完全出现后，再去设置，否则有可能会出问题 
        visitorLoginView?.setUpInfo("visitordiscover_feed_image_house", message: "关注一些人，回这里看看有什么惊喜", isHome: true)
     }
    
}
  /// 转场临时视图
  var dummyView: UIView?
  ///转场的启动位置
  var dummyStartRect = CGRectZero
  ///转场的结束位置
  var dummyEndRect = CGRectZero

  /// 是否 Modal
  var isPresent = false

// 指定转场动画的执行
extension HomeTableViewController: UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning {
    
    // 指定谁负责转场动画
    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        
        isPresent = true
        return self
    }
    // 指定谁负责转场动画
    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        
        isPresent = false
        return self
    }
    
    // 指定转场时长
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
        return 2.0
    }
    
    // transitionContext 提供了转场的细节
    /**
    整个视图移动的原因
    1. 照片查看器的层次很多，直接修改 toView 的 frame 动画，并不会更改内部 view 的大小
    2. 在展开照片查看器之前，大图并没有被下载，无法(也不应该)使用大图来做转场的目标图片
    
    思路：使用缩略图，进行转场
    
    一旦实现了这个方法，后续的所有操作，都需要我们自己来！
    
    接下来的问题：
    1. 计算动画的起始位置
    2. 计算动画的目标位置
    */
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        
        let duration = transitionDuration(transitionContext)
        if isPresent {
         // Modal 动画处理
         // 找到目标视图
            if let toView = transitionContext.viewForKey(UITransitionContextToViewKey) {
                
                // 添加到容器视图中
                transitionContext.containerView().addSubview(toView)
                
                toView.frame = CGRectMake(0, 0, 0, 0)
                toView.alpha = 0
                UIView.animateWithDuration(transitionDuration(transitionContext),
                    animations: { () -> Void in
                        toView.frame = UIScreen.mainScreen().bounds
                        toView.alpha = 1.0
                    }, completion: { (_) -> Void in
                        // 表示转场结束
                        transitionContext.completeTransition(true)
                })
            }
        } else {
          let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)
            let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) as! PhotoBrowserViewController
            
            let photoCell = fromVC.collectionView.visibleCells().last as! PhotoBrowserCell
            let imageView = photoCell.viewerVC!.view
            
            println("----")
            println(fromView)
            println(fromVC)
            println(imageView)
            
            //抓取快照，合成一个视图
            let dummy = imageView.snapshotViewAfterScreenUpdates(false)
            // 隐藏 fromView
            fromView?.hidden = true
            
            let rect = CGRectMake(CGRectGetMidX(dummyStartRect), CGRectGetMidY(dummyStartRect), 0, 0)
            // 将fromView 添加到容器视图中
            transitionContext.containerView().addSubview(dummy)
            
            UIView.animateWithDuration(duration, animations: { () -> Void in
                dummy.frame = rect
            }, completion: { (_) -> Void in
                transitionContext.completeTransition(true)
            })
        }
    }
}



